﻿using Cotizav.LogicaNegocio;
using Cotizav.Presentacion.WinForms.Condicion;
using Cotizav.Presentacion.WinForms.Persona.Cliente;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Cotizav.Util.Comparadores;
using Cotizav.Presentacion.WinForms.Cotizacion.Cotizacion.Condicion;
using Cotizav.Presentacion.WinForms.Cotizacion.Cotizacion.Equipo;

namespace Cotizav.Presentacion.WinForms.Cotizacion
{
    public partial class RegistroCotizacion : Form
    {
        private List<Entidades.CotizacionCondicion> listCotizacionCondicion;
        private BindingList<Entidades.CotizacionDetalle> listCotizacionDetalle;

        public RegistroCotizacion()
        {
            InitializeComponent();

            listCotizacionCondicion = new List<Entidades.CotizacionCondicion>();

            listCotizacionDetalle = new BindingList<Entidades.CotizacionDetalle>();
            listCotizacionDetalle.AllowNew = false;
        }

        private void RegistroCotizacion_Load(object sender, EventArgs e)
        {
            LoadComboTipoCotizacion();
            LoadComboVendedor();
            LoadComboSucursal();

            gridCotizacionEquipos.DataSource = listCotizacionDetalle;
        }

        private void LoadComboTipoCotizacion()
        {
            TipoCotizacionBLL tipocotizacionBLL = new TipoCotizacionBLL();
            cmbTipoCotizacion.DataSource = tipocotizacionBLL.Listar();
            cmbTipoCotizacion.DisplayMember = "Descripcion";
            cmbTipoCotizacion.ValueMember = "IdTipoCotizacion";
            cmbTipoCotizacion.SelectedIndex = -1;
        }

        private void LoadComboVendedor()
        {
            VendedorBLL vendedorBLL = new VendedorBLL();
            cmbVendedor.DataSource = vendedorBLL.Listar();
            cmbVendedor.DisplayMember = "Nombre";
            cmbVendedor.ValueMember = "IdVendedor";
            cmbVendedor.SelectedIndex = -1;
        }

        private void LoadComboSucursal()
        {
            SucursalBLL sucursalBLL = new SucursalBLL();
            cmbSucursal.DataSource = sucursalBLL.Listar();
            cmbSucursal.DisplayMember = "NombreSucursal";
            cmbSucursal.ValueMember = "IdSucursal";
            cmbSucursal.SelectedIndex = -1;
        }

        private void LoadComboContacto(Entidades.Cliente selCliente)
        {
            ContactoBLL contactoBLL = new ContactoBLL();
            cmbContacto.DataSource = contactoBLL.Listar(selCliente);
            cmbContacto.DisplayMember = "Nombre";
            cmbContacto.ValueMember = "IdContacto";
            cmbContacto.SelectedIndex = -1;
        }

        private void btnBuscarCliente_Click(object sender, EventArgs e)
        {
            BuscarCliente iuBusqueda = new BuscarCliente();
            DialogResult dr = iuBusqueda.ShowDialog();

            if (dr == DialogResult.OK)
            {
                Entidades.Cliente resultCliente = iuBusqueda.Result;
                
                if (resultCliente != null)
                {
                    txtCliente.Tag = resultCliente;
                    txtCliente.Text = resultCliente.RazonSocial;

                    LoadComboContacto(resultCliente);

                    if (cmbContacto.Items.Count == 0)
                    {
                        MessageBox.Show("El cliente no tiene asociado contactos.\nSeleccione otro cliente o registre los contactos en el maestro de clientes.", "Cotizav", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1);
                        
                        txtCliente.Tag = null;
                        txtCliente.ResetText();
                    }
                }
            }
        }

        private void cmbTipoCotizacion_SelectionChangeCommitted(object sender, EventArgs e)
        {
            if (listCotizacionDetalle.Count > 0)
            {
                if (cmbTipoCotizacion.Tag != null)
                {
                    DialogResult dr = MessageBox.Show(this, "Al cambiar de tipo de Cotizacion se eliminarán todos los equipos agregados.\n¿Esta seguro que desea continuar?", "Cotizav", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2);

                    if (dr == DialogResult.Yes)
                    {
                        //listaCotizacionDetalle.Clear();
                        listCotizacionDetalle.Clear();
                        listCotizacionCondicion.Clear();

                        cmbMoneda.Enabled = true;
                        txtTipoCambio.ReadOnly = false;
                        //gridCotizacionEquipos.DataSource = null;
                    }
                    else
                    {
                        cmbTipoCotizacion.SelectedIndex = int.Parse(cmbTipoCotizacion.Tag.ToString());
                        cmbTipoCotizacion.Tag = null;
                    }
                }                
            }

            if (cmbTipoCotizacion.SelectedIndex >= 0)
            {
                string nameTipoCotizacion = (cmbTipoCotizacion.SelectedItem as Entidades.TipoCotizacion).Descripcion;

                switch (nameTipoCotizacion)
                {
                    case "Alquiler":
                        btnAddAlternativa.Enabled = true;

                        lblValorVenta.Visible = false;
                        lblDescuento.Visible = false;
                        lblValorNeto.Visible = false;
                        lblImpuestos.Visible = false;
                        lblMontoTotal.Visible = false;

                        txtValorVenta.Visible = false;
                        txtDescuento.Visible = false;
                        txtValorNeto.Visible = false;
                        txtImpuestos.Visible = false;
                        txtMontoTotal.Visible = false;
                        

                        break;

                    case "Venta":
                        btnAddAlternativa.Enabled = false;

                        lblValorVenta.Visible = true;
                        lblDescuento.Visible = true;
                        lblValorNeto.Visible = true;
                        lblImpuestos.Visible = true;
                        lblMontoTotal.Visible = true;

                        txtValorVenta.Visible = true;
                        txtDescuento.Visible = true;
                        txtValorNeto.Visible = true;
                        txtImpuestos.Visible = true;
                        txtMontoTotal.Visible = true;

                        break;
                }
            }
        }

        private void cmbTipoCotizacion_DropDown(object sender, EventArgs e)
        {
            if (cmbTipoCotizacion.SelectedIndex >= 0)
            {
                cmbTipoCotizacion.Tag = cmbTipoCotizacion.SelectedIndex;
            }
        }

        #region Condicion
        private void btnAddCondicion_Click(object sender, EventArgs e)
        {
            BuscarCondicion iuBusqueda = new BuscarCondicion();
            DialogResult dr = iuBusqueda.ShowDialog();

            if (dr == DialogResult.OK)
            {
                //listaCotizacionCondicion = iuBusqueda.Result;
                listCotizacionCondicion = listCotizacionCondicion.Union(iuBusqueda.Result, new CotizacionCondicion_Comparer()).ToList();                

                gridCondicion.DataSource = listCotizacionCondicion;
                gridCondicion.ClearSelection();
            }
        }

        private void btnModificarContenido_Click(object sender, EventArgs e)
        {
            if (gridCondicion.SelectedRows.Count > 0)
            {
                Entidades.CotizacionCondicion selCotiCondicion = gridCondicion.SelectedRows[0].DataBoundItem as Entidades.CotizacionCondicion;
                int selectedIndex = gridCondicion.SelectedRows[0].Index;

                if (selCotiCondicion != null)
                {
                    CotizacionCondicion_Modificar iuDialog = new CotizacionCondicion_Modificar(selCotiCondicion);
                    iuDialog.ShowDialog(this);

                    if (iuDialog.DialogResult == DialogResult.OK)
                    {
                        if (iuDialog.Resultado != null)
                        {
                            listCotizacionCondicion[selectedIndex].IdTipoCondicion = iuDialog.Resultado.IdTipoCondicion;
                            listCotizacionCondicion[selectedIndex].TipoCondicion = iuDialog.Resultado.TipoCondicion;
                            listCotizacionCondicion[selectedIndex].Descripcion = iuDialog.Resultado.Descripcion;

                            gridCondicion.DataSource = null;
                            gridCondicion.DataSource = listCotizacionCondicion;
                            gridCondicion.ClearSelection();
                        }
                    }
                }
            }
        }

        private void btnDelCondicion_Click(object sender, EventArgs e)
        {
            if (gridCondicion.SelectedRows.Count > 0)
            {
                int selIndex = gridCondicion.SelectedRows[0].Index;

                listCotizacionCondicion.RemoveAt(selIndex);

                gridCondicion.DataSource = null;
                gridCondicion.DataSource = listCotizacionCondicion;
                gridCondicion.ClearSelection();
            }
        }

        private void gridCondicion_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
        {
            if (gridCondicion.DataSource != null)
            {
                gridCondicion.Columns["IdCotizacionCondicion"].Visible = false;
                gridCondicion.Columns["IdCotizacion"].Visible = false;
                gridCondicion.Columns["IdCondicion"].Visible = false;
                gridCondicion.Columns["IdTipoCondicion"].Visible = false;
                gridCondicion.Columns["TipoCondicion"].HeaderText = "Tipo de condición";
                gridCondicion.Columns["Descripcion"].HeaderText = "Descripción";
                gridCondicion.Columns["Activo"].Visible = false;
            }
        }
        
        #endregion

        #region Cotizacion
        private void CalcularMontoTotal()
        {
            if (listCotizacionDetalle.Count > 0)
            {
                txtMontoTotal.Text = (listCotizacionDetalle.Sum(x => x.TarifaTotal).HasValue ? listCotizacionDetalle.Sum(x => x.TarifaTotal).Value : new decimal(0)).ToString("N");
            }
            else
            {
                txtMontoTotal.Text = "0.00";
            }
        }

        private void CalcularImpuestos()
        {
            if (listCotizacionDetalle.Count > 0)
            {
                txtImpuestos.Text = (listCotizacionDetalle.Sum(x => x.Impuestos).HasValue ? listCotizacionDetalle.Sum(x => x.Impuestos).Value : new decimal(0)).ToString("N");
            }
            else
            {
                txtImpuestos.Text  = "0.00";
            }
        }

        private void CalcularValorNeto()
        {
            if (listCotizacionDetalle.Count > 0)
            {
                txtValorNeto.Text = (listCotizacionDetalle.Sum(x => x.ValorNeto).HasValue ? listCotizacionDetalle.Sum(x => x.ValorNeto).Value : new decimal(0)).ToString("N");
            }
            else
            {
                txtValorNeto.Text = "0.00";
            }
        }

        private void CalcularDescuento()
        {
            if (listCotizacionDetalle.Count > 0)
            {
                txtDescuento.Text = (listCotizacionDetalle.Sum(x => x.Dscto).HasValue ? listCotizacionDetalle.Sum(x => x.Dscto).Value : new decimal(0)).ToString("N");
            }
            else
            {
                txtDescuento.Text = "0.00";
            }
        }

        private void CalcularValorVenta()
        {
            if (listCotizacionDetalle.Count > 0)
            {
                txtValorVenta.Text = (listCotizacionDetalle.Sum(x => x.Tarifa).HasValue ? listCotizacionDetalle.Sum(x => x.Tarifa).Value : new decimal(0)).ToString("N");
            }
            else
            {
                txtValorVenta.Text = "0.00"; ;
            }
        }

        private void btnAddEquipo_Click(object sender, EventArgs e)
        {
            if (cmbTipoCotizacion.SelectedIndex >= 0)
            {
                if (cmbMoneda.SelectedIndex >= 0)
                {
                    if (!string.IsNullOrWhiteSpace(txtTipoCambio.Text))
                    {
                        Entidades.TipoCotizacion tipoCotizacion = cmbTipoCotizacion.SelectedItem as Entidades.TipoCotizacion;

                        if (tipoCotizacion != null)
                        {
                            string moneda = cmbMoneda.SelectedItem.ToString();
                            decimal tipoCambio = decimal.Parse(txtTipoCambio.Text);
                            List<Entidades.CotizacionDetalle> liCotDet = listCotizacionDetalle.ToList();

                            switch (tipoCotizacion.Descripcion)
                            {
                                case "Alquiler":                                    
                                    Cotizacion_AgregarEquipo_Alquiler iuDialogAlquiler = new Cotizacion_AgregarEquipo_Alquiler(moneda, tipoCambio, liCotDet);
                                    DialogResult = iuDialogAlquiler.ShowDialog();

                                    Entidades.CotizacionDetalle selCotizacionDetalle1 = iuDialogAlquiler.Result;

                                    if (selCotizacionDetalle1 != null)
                                    {
                                        int secuencia = listCotizacionDetalle.Count + 1;
                                        selCotizacionDetalle1.Secuencia = secuencia;

                                        //listaCotizacionDetalle.Add(selCotizacionDetalle1);
                                        listCotizacionDetalle.Add(selCotizacionDetalle1);
                                    }

                                    break;
                                case "Venta":
                                    Cotizacion_AgregarEquipo_Venta iuDialogVenta = new Cotizacion_AgregarEquipo_Venta(moneda, tipoCambio, liCotDet);
                                    DialogResult = iuDialogVenta.ShowDialog();

                                    Entidades.CotizacionDetalle selCotizacionDetalle2 = iuDialogVenta.Result;

                                    if (selCotizacionDetalle2 != null)
                                    {
                                        int secuencia = listCotizacionDetalle.Count + 1;
                                        selCotizacionDetalle2.Secuencia = secuencia;

                                        //listaCotizacionDetalle.Add(selCotizacionDetalle2);
                                        listCotizacionDetalle.Add(selCotizacionDetalle2);
                                    }

                                    CalcularValorVenta();
                                    CalcularDescuento();
                                    CalcularValorNeto();
                                    CalcularImpuestos();
                                    CalcularMontoTotal();
                                    break;
                            }

                            //gridCotizacionEquipos.DataSource = null;
                            //gridCotizacionEquipos.DataSource = listaCotizacionDetalle;
                            gridCotizacionEquipos.ClearSelection();
                        }
                    }
                    else
                    {
                        MessageBox.Show("Seleccione el tipo de cambio para el cálculo en la cotización.", "Cotizav", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1);
                    }
                }
                else
                {
                    MessageBox.Show("Seleccione la moneda para el cálculo en la cotización.", "Cotizav", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1);
                }
            }
            else
            {
                MessageBox.Show("Seleccione el tipo de cotización.", "Cotizav", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1);
            }
        }

        private void gridCotizacionEquipos_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
        {
            if (gridCotizacionEquipos.Rows.Count > 0)
            //if (gridCotizacionEquipos.DataSource != null)
            {
                if (cmbTipoCotizacion.SelectedIndex >= 0)
                {
                    Entidades.TipoCotizacion selTipoCotizacion = cmbTipoCotizacion.SelectedItem as Entidades.TipoCotizacion;

                    gridCotizacionEquipos.ColumnHeadersVisible = true;

                    switch (selTipoCotizacion.Descripcion.ToUpper())
                    {
                        case "ALQUILER":
                            gridCotizacionEquipos.Columns["IdCotizacionDetalle"].Visible = false;
                            gridCotizacionEquipos.Columns["IdCotizacion"].Visible = false;
                            gridCotizacionEquipos.Columns["IdEquipo"].Visible = false;
                            gridCotizacionEquipos.Columns["Secuencia"].Visible = false;
                            gridCotizacionEquipos.Columns["Alternativa"].Visible = false;
                            gridCotizacionEquipos.Columns["NombreEquipo"].HeaderText = "Equipo";
                            gridCotizacionEquipos.Columns["CodigoEquipo"].HeaderText = "Codigo";
                            gridCotizacionEquipos.Columns["CodigoEquipo"].DisplayIndex = 0;
                            gridCotizacionEquipos.Columns["SerieEquipo"].Visible = false;
                            gridCotizacionEquipos.Columns["HorasEquipo"].Visible = false;
                            gridCotizacionEquipos.Columns["Anio"].Visible = false;
                            gridCotizacionEquipos.Columns["Moneda"].Visible = false;
                            gridCotizacionEquipos.Columns["Cantidad"].Visible = false;
                            gridCotizacionEquipos.Columns["HoraTarifa"].HeaderText = "Horas";
                            gridCotizacionEquipos.Columns["HoraTarifa"].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
                            gridCotizacionEquipos.Columns["PrecioUnitario"].Visible = false;
                            gridCotizacionEquipos.Columns["PrecioUnitarioExt"].Visible = false;
                            gridCotizacionEquipos.Columns["PrecioUnitarioLoc"].Visible = false;
                            gridCotizacionEquipos.Columns["MontoTarifa"].HeaderText = "Tarifa";
                            gridCotizacionEquipos.Columns["MontoTarifa"].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight;
                            gridCotizacionEquipos.Columns["MontoTarifaExt"].Visible = false;
                            gridCotizacionEquipos.Columns["MontoTarifaLoc"].Visible = false;
                            gridCotizacionEquipos.Columns["Tarifa"].HeaderText = "Tarifa por Hora";
                            gridCotizacionEquipos.Columns["Tarifa"].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight;
                            gridCotizacionEquipos.Columns["TarifaExt"].Visible = false;
                            gridCotizacionEquipos.Columns["TarifaLoc"].Visible = false;
                            gridCotizacionEquipos.Columns["DsctoEnDocumento"].Visible = false;
                            gridCotizacionEquipos.Columns["Dscto"].HeaderText = "Descuento";
                            gridCotizacionEquipos.Columns["Dscto"].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight;
                            gridCotizacionEquipos.Columns["DsctoExt"].Visible = false;
                            gridCotizacionEquipos.Columns["DsctoLoc"].Visible = false;
                            gridCotizacionEquipos.Columns["Impuestos"].Visible = false;
                            gridCotizacionEquipos.Columns["ImpuestosExt"].Visible = false;
                            gridCotizacionEquipos.Columns["ImpuestosLoc"].Visible = false;
                            gridCotizacionEquipos.Columns["TarifaTotal"].HeaderText = "Tarifa Total";
                            gridCotizacionEquipos.Columns["TarifaTotal"].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight;
                            gridCotizacionEquipos.Columns["TarifaTotalExt"].Visible = false;
                            gridCotizacionEquipos.Columns["TarifatotalLoc"].Visible = false;
                            gridCotizacionEquipos.Columns["TipoTarifa"].Visible = false;
                            gridCotizacionEquipos.Columns["Activo"].Visible = false;
                            gridCotizacionEquipos.Columns["Eliminado"].Visible = false;
                            break;
                        case "VENTA":
                            gridCotizacionEquipos.Columns["IdCotizacionDetalle"].Visible = false;
                            gridCotizacionEquipos.Columns["IdCotizacion"].Visible = false;
                            gridCotizacionEquipos.Columns["IdEquipo"].Visible = false;
                            gridCotizacionEquipos.Columns["Secuencia"].Visible = false;
                            gridCotizacionEquipos.Columns["Alternativa"].Visible = false;
                            gridCotizacionEquipos.Columns["NombreEquipo"].HeaderText = "Equipo";
                            gridCotizacionEquipos.Columns["CodigoEquipo"].HeaderText = "Codigo";
                            gridCotizacionEquipos.Columns["CodigoEquipo"].DisplayIndex = 0;
                            gridCotizacionEquipos.Columns["SerieEquipo"].HeaderText = "Serie";
                            gridCotizacionEquipos.Columns["HorasEquipo"].HeaderText = "Horas";
                            gridCotizacionEquipos.Columns["Anio"].HeaderText = "Año";
                            gridCotizacionEquipos.Columns["Moneda"].Visible = false;
                            gridCotizacionEquipos.Columns["Cantidad"].HeaderText = "Cantidad";
                            gridCotizacionEquipos.Columns["HoraTarifa"].Visible = false;
                            gridCotizacionEquipos.Columns["MontoTarifa"].HeaderText = "Precio";
                            gridCotizacionEquipos.Columns["MontoTarifa"].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight;
                            gridCotizacionEquipos.Columns["MontoTarifaExt"].Visible = false;
                            gridCotizacionEquipos.Columns["MontoTarifaLoc"].Visible = false;
                            gridCotizacionEquipos.Columns["Tarifa"].HeaderText = "Valor de Venta";
                            gridCotizacionEquipos.Columns["Tarifa"].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight;
                            gridCotizacionEquipos.Columns["TarifaExt"].Visible = false;
                            gridCotizacionEquipos.Columns["TarifaLoc"].Visible = false;
                            gridCotizacionEquipos.Columns["DsctoEnDocumento"].Visible = false;
                            gridCotizacionEquipos.Columns["Dscto"].HeaderText = "Descuento";
                            gridCotizacionEquipos.Columns["Dscto"].DisplayIndex = 19;
                            gridCotizacionEquipos.Columns["Dscto"].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight;
                            gridCotizacionEquipos.Columns["DsctoExt"].Visible = false;
                            gridCotizacionEquipos.Columns["DsctoLoc"].Visible = false;
                            gridCotizacionEquipos.Columns["ValorNeto"].HeaderText = "Valor Neto";
                            gridCotizacionEquipos.Columns["ValorNeto"].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight;
                            gridCotizacionEquipos.Columns["ValorNetoExt"].Visible = false;
                            gridCotizacionEquipos.Columns["ValorNetoLoc"].Visible = false;
                            gridCotizacionEquipos.Columns["Impuestos"].HeaderText = "Impuestos";
                            gridCotizacionEquipos.Columns["Impuestos"].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight;
                            gridCotizacionEquipos.Columns["ImpuestosExt"].Visible = false;
                            gridCotizacionEquipos.Columns["ImpuestosLoc"].Visible = false;
                            gridCotizacionEquipos.Columns["TarifaTotal"].HeaderText = "Monto Total";
                            gridCotizacionEquipos.Columns["TarifaTotal"].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight;
                            gridCotizacionEquipos.Columns["TarifaTotalExt"].Visible = false;
                            gridCotizacionEquipos.Columns["TarifatotalLoc"].Visible = false;
                            gridCotizacionEquipos.Columns["TipoTarifa"].Visible = false;
                            gridCotizacionEquipos.Columns["Activo"].Visible = false;
                            gridCotizacionEquipos.Columns["Eliminado"].Visible = false;
                            break;
                    }
                }
            }
            else
            {
                gridCotizacionEquipos.ColumnHeadersVisible = false;
            }
        }

        private void btnAddAlternativa_Click(object sender, EventArgs e)
        {
            if (gridCotizacionEquipos.SelectedRows.Count > 0)
            {
                Entidades.CotizacionDetalle selCotizacionDetalle =
                    gridCotizacionEquipos.SelectedRows[0].DataBoundItem as Entidades.CotizacionDetalle;
                int selectedIndex = gridCotizacionEquipos.SelectedRows[0].Index;

                if (selCotizacionDetalle != null)
                {                    
                    if (selCotizacionDetalle.Alternativa.Value == 0)
                    {
                        Entidades.TipoCotizacion tipoCotizacion = cmbTipoCotizacion.SelectedItem as Entidades.TipoCotizacion;

                        if (tipoCotizacion != null)
                        {
                            string moneda = cmbMoneda.SelectedItem.ToString();
                            decimal tipoCambio = decimal.Parse(txtTipoCambio.Text);

                            switch (tipoCotizacion.Descripcion)
                            {
                                case "Alquiler":
                                    Cotizacion_AgregarEquipo_Alquiler iuDialogAlquiler =
                                        new Cotizacion_AgregarEquipo_Alquiler(moneda, tipoCambio, selCotizacionDetalle);
                                    DialogResult = iuDialogAlquiler.ShowDialog();

                                    Entidades.CotizacionDetalle CotDetAlternativa = iuDialogAlquiler.Result;

                                    if (CotDetAlternativa != null)
                                    {
                                        listCotizacionDetalle.Insert(selectedIndex + 1, CotDetAlternativa);

                                        //reordenamos el campo de secuencia
                                        int baseSecuencia = 0;
                                        foreach (Entidades.CotizacionDetalle cd in listCotizacionDetalle)
                                        {
                                            cd.Secuencia = baseSecuencia;
                                            baseSecuencia++;
                                        }
                                    }
                                    break;
                            }
                        }
                    }
                }
            }
        }

        private void btnDelEquipo_Click(object sender, EventArgs e)
        {
            if (gridCotizacionEquipos.SelectedRows.Count > 0)
            {
                Entidades.TipoCotizacion tipoCotizacion = cmbTipoCotizacion.SelectedItem as Entidades.TipoCotizacion;
                Entidades.CotizacionDetalle selCotizacionDetalle =
                    gridCotizacionEquipos.SelectedRows[0].DataBoundItem as Entidades.CotizacionDetalle;
                int selectedIndex = gridCotizacionEquipos.SelectedRows[0].Index;

                if (selCotizacionDetalle != null)
                {
                    switch (selCotizacionDetalle.Alternativa.Value)
                    {
                        case 0 : //principal
                            List<Entidades.CotizacionDetalle> listFiltro = listCotizacionDetalle.Where(x => x.CodigoEquipo.Trim().Equals(selCotizacionDetalle.CodigoEquipo.Trim())).ToList();

                            foreach (Entidades.CotizacionDetalle cd in listFiltro)
                            {
                                int indice = listCotizacionDetalle.ToList().FindIndex(x => x.CodigoEquipo.Equals(cd.CodigoEquipo) && x.Secuencia.Equals(cd.Secuencia));
                                listCotizacionDetalle.RemoveAt(indice);
                            }

                            break;
                        case 1:  //alternativa
                            listCotizacionDetalle.RemoveAt(selectedIndex);
                            break;
                    }

                    //reordenamos el campo de secuencia
                    int baseSecuencia = 0;
                    foreach (Entidades.CotizacionDetalle cd in listCotizacionDetalle)
                    {
                        cd.Secuencia = baseSecuencia;
                        baseSecuencia++;
                    }

                    if (tipoCotizacion.Descripcion == "Venta")
                    {

                        CalcularValorVenta();
                        CalcularDescuento();
                        CalcularValorNeto();
                        CalcularImpuestos();
                        CalcularMontoTotal();
                    }
                }
            }
        }

        #endregion

        private void Limpiar_TabCondicion()
        {
            listCotizacionCondicion.Clear();
            gridCondicion.DataSource = null;
        }

        private void Limpiar_TabDetalle()
        {
            listCotizacionDetalle.Clear();

            cmbMoneda.SelectedIndex = -1;
            txtTipoCambio.ResetText();
            gridCotizacionEquipos.DataSource = null;

            txtValorVenta.ResetText();            
            txtDescuento.ResetText();
            txtValorNeto.ResetText();
            txtImpuestos.ResetText();
            txtMontoTotal.ResetText();

            lblValorVenta.Visible = false;
            lblDescuento.Visible = false;
            lblValorNeto.Visible = false;
            lblImpuestos.Visible = false;
            lblMontoTotal.Visible = false;

            txtValorVenta.Visible = false;
            txtDescuento.Visible = false;
            txtValorNeto.Visible = false;
            txtImpuestos.Visible = false;
            txtMontoTotal.Visible = false;
        }

        private void Limpiar_GrupoCabecera()
        {
            LoadComboTipoCotizacion();
            LoadComboSucursal();
            LoadComboVendedor();

            txtCliente.Tag = null;
            txtCliente.ResetText();
            txtReferencia.ResetText();
            txtObra.ResetText();
            cmbContacto.DataSource = null;
        }


        private void btnGuardar_Click(object sender, EventArgs e)
        {
            Entidades.TipoCotizacion tipoCotizacion = cmbTipoCotizacion.SelectedItem as Entidades.TipoCotizacion;

            if (tipoCotizacion != null)
            {
                LogicaNegocio.CotizacionBLL cotizacionBLL = new CotizacionBLL();

                try
                {
                    Entidades.Cotizacion newCotizacion =
                        new Entidades.Cotizacion()
                        {
                            IdTipoCotizacion = cmbTipoCotizacion.SelectedIndex >= 0 ? (cmbTipoCotizacion.SelectedItem as Entidades.TipoCotizacion).IdTipoCotizacion : new Nullable<int>(),
                            IdCliente = txtCliente.Tag != null ? (txtCliente.Tag as Entidades.Cliente).IdCliente : new Nullable<int>(),
                            NombreCliente = txtCliente.Tag != null ? (txtCliente.Tag as Entidades.Cliente).RazonSocial.Trim() : string.Empty,
                            IdSucursal = cmbSucursal.SelectedIndex >= 0 ? (cmbSucursal.SelectedItem as Entidades.Sucursal).IdSucursal : new Nullable<int>(),
                            Referencia = txtReferencia.Text.Trim(),
                            Obra = txtObra.Text.Trim(),
                            NombreSucursal = cmbSucursal.SelectedIndex >= 0? (cmbSucursal.SelectedItem as Entidades.Sucursal).NombreSucursal : string.Empty,
                            IdContacto = cmbContacto.SelectedIndex >= 0 ? (cmbContacto.SelectedItem as Entidades.Contacto).IdContacto : new Nullable<int>(),
                            NombreContacto = cmbContacto.SelectedIndex >= 0 ? (cmbContacto.SelectedItem as Entidades.Contacto).Nombre : string.Empty,
                            IdVendedor = cmbVendedor.SelectedIndex >= 0 ? (cmbVendedor.SelectedItem as Entidades.Vendedor).IdVendedor : new Nullable<int>(),
                            NombreVendedor = cmbVendedor.SelectedIndex >= 0 ? (cmbVendedor.SelectedItem as Entidades.Vendedor).Nombre : string.Empty,
                            TipoCambio = !string.IsNullOrWhiteSpace(txtTipoCambio.Text) ? Convert.ToDecimal(txtTipoCambio.Text) : new Nullable<decimal>(),
                            Moneda = cmbMoneda.SelectedIndex >= 0 ? cmbMoneda.SelectedItem.ToString() : string.Empty,
                            Igv = txtIGV.Text,
                            PrecioTotal = tipoCotizacion.Descripcion == "Venta" ? !string.IsNullOrWhiteSpace(txtValorVenta.Text) ? Convert.ToDecimal(txtValorVenta.Text) : new Nullable<decimal>() : new Nullable<decimal>(),
                            PrecioTotalExt = tipoCotizacion.Descripcion == "Venta" ? cmbMoneda.SelectedIndex >= 0 && !string.IsNullOrWhiteSpace(txtTipoCambio.Text) && !string.IsNullOrWhiteSpace(txtValorVenta.Text) ? cmbMoneda.ToString().ToUpper().Equals("EXTRANJERA") ? decimal.Parse(txtValorVenta.Text) : (decimal.Parse(txtValorVenta.Text) * Convert.ToDecimal(txtTipoCambio.Text)) : new Nullable<decimal>() : new Nullable<int>(),
                            PrecioTotalLoc = tipoCotizacion.Descripcion == "Venta" ? cmbMoneda.SelectedIndex >= 0 && !string.IsNullOrWhiteSpace(txtTipoCambio.Text) && !string.IsNullOrWhiteSpace(txtValorVenta.Text) ? cmbMoneda.ToString().ToUpper().Equals("LOCAL") ? decimal.Parse(txtValorVenta.Text) : (decimal.Parse(txtValorVenta.Text) / Convert.ToDecimal(txtTipoCambio.Text)) : new Nullable<decimal>() : new Nullable<int>(),
                            Dscto = tipoCotizacion.Descripcion == "Venta" ? !string.IsNullOrWhiteSpace(txtDescuento.Text) ?Convert.ToDecimal(txtDescuento.Text) : new Nullable<decimal>() : new Nullable<decimal>(),
                            DsctoExt = tipoCotizacion.Descripcion == "Venta" ? cmbMoneda.SelectedIndex >= 0 && !string.IsNullOrWhiteSpace(txtTipoCambio.Text) && !string.IsNullOrWhiteSpace(txtDescuento.Text) ? cmbMoneda.ToString().ToUpper().Equals("EXTRANJERA") ? decimal.Parse(txtDescuento.Text) : (decimal.Parse(txtDescuento.Text) * Convert.ToDecimal(txtTipoCambio.Text)) : new Nullable<decimal>() : new Nullable<decimal>(),
                            DsctoLoc = tipoCotizacion.Descripcion == "Venta" ? cmbMoneda.SelectedIndex >= 0 && !string.IsNullOrWhiteSpace(txtTipoCambio.Text) && !string.IsNullOrWhiteSpace(txtDescuento.Text) ? cmbMoneda.ToString().ToUpper().Equals("LOCAL") ? decimal.Parse(txtDescuento.Text) : (decimal.Parse(txtDescuento.Text) / Convert.ToDecimal(txtTipoCambio.Text)) : new Nullable<decimal>() : new Nullable<decimal>(),
                            ValorVenta = tipoCotizacion.Descripcion == "Venta" ? !string.IsNullOrWhiteSpace(txtValorNeto.Text) ? Convert.ToDecimal(txtValorNeto.Text) : new Nullable<decimal>() : new Nullable<decimal>(),
                            ValorVentaExt = tipoCotizacion.Descripcion == "Venta" ? cmbMoneda.SelectedIndex >= 0 && !string.IsNullOrWhiteSpace(txtTipoCambio.Text) && !string.IsNullOrWhiteSpace(txtValorNeto.Text) ? cmbMoneda.ToString().ToUpper().Equals("EXTRANJERA") ? decimal.Parse(txtValorNeto.Text) : (decimal.Parse(txtValorNeto.Text) * Convert.ToDecimal(txtTipoCambio.Text)) : new Nullable<decimal>() : new Nullable<decimal>(),
                            ValorVentaLoc = tipoCotizacion.Descripcion == "Venta" ? cmbMoneda.SelectedIndex >= 0 && !string.IsNullOrWhiteSpace(txtTipoCambio.Text) && !string.IsNullOrWhiteSpace(txtValorNeto.Text) ? cmbMoneda.ToString().ToUpper().Equals("LOCAL") ? decimal.Parse(txtValorNeto.Text) : (decimal.Parse(txtValorNeto.Text) / Convert.ToDecimal(txtTipoCambio.Text)) : new Nullable<decimal>() : new Nullable<decimal>(),
                            Impuestos = tipoCotizacion.Descripcion == "Venta" ? !string.IsNullOrWhiteSpace(txtImpuestos.Text) ? Convert.ToDecimal(txtImpuestos.Text) : new Nullable<decimal>() : new Nullable<decimal>(),
                            ImpuestosExt = tipoCotizacion.Descripcion == "Venta" ? cmbMoneda.SelectedIndex >= 0 && !string.IsNullOrWhiteSpace(txtTipoCambio.Text) && !string.IsNullOrWhiteSpace(txtImpuestos.Text) ? cmbMoneda.ToString().ToUpper().Equals("EXTRANJERA") ? decimal.Parse(txtImpuestos.Text) : (decimal.Parse(txtImpuestos.Text) * Convert.ToDecimal(txtTipoCambio.Text)) : new Nullable<decimal>() : new Nullable<decimal>(),
                            ImpuestosLoc = tipoCotizacion.Descripcion == "Venta" ? cmbMoneda.SelectedIndex >= 0 && !string.IsNullOrWhiteSpace(txtTipoCambio.Text) && !string.IsNullOrWhiteSpace(txtImpuestos.Text) ? cmbMoneda.ToString().ToUpper().Equals("LOCAL") ? decimal.Parse(txtImpuestos.Text) : (decimal.Parse(txtImpuestos.Text) / Convert.ToDecimal(txtTipoCambio.Text)) : new Nullable<decimal>() : new Nullable<decimal>(),
                            Total = tipoCotizacion.Descripcion == "Venta" ? !string.IsNullOrWhiteSpace(txtMontoTotal.Text) ? Convert.ToDecimal(txtMontoTotal.Text) : new Nullable<decimal>() : new Nullable<decimal>(),
                            TotalExt = tipoCotizacion.Descripcion == "Venta" ? cmbMoneda.SelectedIndex >= 0 && !string.IsNullOrWhiteSpace(txtTipoCambio.Text) && !string.IsNullOrWhiteSpace(txtMontoTotal.Text) ? cmbMoneda.ToString().ToUpper().Equals("EXTRANJERA") ? decimal.Parse(txtMontoTotal.Text) : (decimal.Parse(txtMontoTotal.Text) * Convert.ToDecimal(txtTipoCambio.Text)) : new Nullable<decimal>() : new Nullable<decimal>(),
                            TotalLoc = tipoCotizacion.Descripcion == "Venta" ? cmbMoneda.SelectedIndex >= 0 && !string.IsNullOrWhiteSpace(txtTipoCambio.Text) && !string.IsNullOrWhiteSpace(txtMontoTotal.Text) ? cmbMoneda.ToString().ToUpper().Equals("LOCAL") ? decimal.Parse(txtMontoTotal.Text) : (decimal.Parse(txtMontoTotal.Text) / Convert.ToDecimal(txtTipoCambio.Text)) : new Nullable<decimal>() : new Nullable<decimal>(),
                            ListCotizacionDetalle = listCotizacionDetalle.ToList(),
                            ListCondicionCotizacion = listCotizacionCondicion,
                            Estado = "PE",
                            Activo = 1,
                            FechaRegistro  = DateTime.Now
                        };

                    string codigoCotizacion = string.Empty;
                    int resultado = cotizacionBLL.Guardar(newCotizacion, ref codigoCotizacion);

                    if (resultado > 0)
                    {
                        MessageBox.Show(string.Format("Cotización registrada.\n N°: {0}", codigoCotizacion), "Cotizav", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1);
                        
                        //limpiar formulario
                        Limpiar_GrupoCabecera();
                        Limpiar_TabDetalle();
                        Limpiar_TabCondicion();

                    }
                }
                catch (ApplicationException aex)
                {
                    MessageBox.Show(aex.Message, "Cotizav", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1);
                }
                catch (FormatException foe)
                {
                    MessageBox.Show(string.Format("Error en objeto: {0}", foe.Source), "Cotizav", MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1);
                }
                catch (ArgumentNullException ane)
                {
                    MessageBox.Show(string.Format("Error en objeto: {0}", ane.Source), "Cotizav", MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1);
                }
                catch (OverflowException oex)
                {
                    MessageBox.Show(string.Format("Error en objeto: {0}", oex.Source), "Cotizav", MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1);
                }
            }
            else
            {
                MessageBox.Show("Seleccione el tipo de cotización", "Cotizav", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1);
            }
        }

        private void btnCancelar_Click(object sender, EventArgs e)
        {
            DialogResult dr = MessageBox.Show("¿Esta seguro en cancelar el registro de la cotización?", "Cotizav", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2);

            if (dr == DialogResult.Yes)
            {
                this.Close();
            }
        }
    }
}
